package futbolfacil.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import futbolfacil.excepcion.DAOExcepcion;
import futbolfacil.modelo.Local;
import futbolfacil.util.ConexionBD;

public class LocalDAO extends BaseDAO {

	public void Insertar (Local oLocal) throws DAOExcepcion {
		
		System.out.println("LocalDAO: Insertar(Local vo)");
		validarDatos(oLocal);
		validarDuplicado(oLocal);
		String query = "Insert local(usr_cod, loc_des, loc_dir, loc_dis, loc_goo_map, loc_tlf) Values (?, ?, ?, ?, ?, ?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, oLocal.getDuenoLocal().getCodigoUsuario());
			stmt.setString(2, oLocal.getDescripcionLocal());
			stmt.setString(3, oLocal.getDireccionLocal());
			stmt.setString(4, oLocal.getDistritoLocal());
			stmt.setString(5, oLocal.getGooMapLocal());
			stmt.setString(6, oLocal.getTelefonoLocal());
			int i = stmt.executeUpdate();
			if (i != 1){
				throw new SQLException("No se pudo insertar");
			} else {
				System.out.println("Local registrado");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void Eliminar(int cod_Local) throws DAOExcepcion {
		
		System.out.println("LocalDAO: Eliminar(int cod_Local)");
		String query = "Delete From local Where loc_cod = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con=ConexionBD.obtenerConexion();
			stmt=con.prepareStatement(query);
			stmt.setInt(1, cod_Local);
			int i = stmt.executeUpdate();
			if (i != 1){
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void Modificar (Local oLocal) throws DAOExcepcion {
	
		System.out.println("LocalDAO: Modificar(Local oLocal)");
		validarDatos(oLocal);
		validarDuplicado(oLocal);
		String query = "Update local Set usr_cod = ?, loc_des = ?, loc_dir = ?, loc_dis = ?," +
					   "loc_goo_map = ?, loc_tlf = ? Where loc_cod = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, oLocal.getDuenoLocal().getCodigoUsuario());
			stmt.setString(2, oLocal.getDescripcionLocal());
			stmt.setString(3, oLocal.getDireccionLocal());
			stmt.setString(4, oLocal.getDistritoLocal());
			stmt.setString(5, oLocal.getGooMapLocal());
			stmt.setString(6, oLocal.getTelefonoLocal());
			stmt.setInt(7, oLocal.getCodigoLocal());
			int i = stmt.executeUpdate();
			if (i != 1){
				throw new SQLException("No se pudo modificar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<Local> Listar() throws DAOExcepcion {
		
		System.out.println("LocalDAO: Listar()");
		Collection<Local> c = new ArrayList<Local>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "Select loc_cod, usr_cod, loc_des, loc_dir, loc_dis, " +
						   "loc_goo_map, loc_tlf From local";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while(rs.next()) {
				Local oLocal = new Local();
				DuenoDAO oDueno = new DuenoDAO();
				oLocal.setCodigoLocal(rs.getInt("loc_cod"));
				oLocal.setDuenoLocal(oDueno.buscarPorCodigo(rs.getInt("usr_cod")));
				oLocal.setDescripcionLocal(rs.getString("loc_des"));
				oLocal.setDireccionLocal(rs.getString("loc_dir"));
				oLocal.setDistritoLocal(rs.getString("loc_dis"));
				oLocal.setGooMapLocal(rs.getString("loc_goo_map"));
				oLocal.setTelefonoLocal(rs.getString("loc_tlf"));
				c.add(oLocal);
			} 
		} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Local Buscar(String des_Local) throws DAOExcepcion {
		
		System.out.println("LocalDAO: buscar(String des_Local)");
		Local oLocal = new Local();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "Select loc_cod, usr_cod, loc_des, loc_dir, loc_dis, " +
						   "loc_goo_map, loc_tlf From local " +
						   "Where loc_des = ?";
			con = ConexionBD.obtenerConexion();
			stmt=con.prepareStatement(query);
			stmt.setString(1, des_Local);
			rs = stmt.executeQuery();
			if (rs.next()) {
				oLocal.setCodigoLocal(rs.getInt("loc_cod"));
				oLocal.setDescripcionLocal(rs.getString("loc_des"));
				oLocal.setDireccionLocal(rs.getString("loc_dir"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oLocal;
	}
	
	
	
	
	
	/* ----------------------------------------------------------------------
	 * Amed Ysmodes
	 */
	
	public Local buscarPorCodigo(int codigo) throws DAOExcepcion {
		
		System.out.println("LocalDAO: buscarPorCodigo(int codigo)");
		Local oLocal = new Local();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "Select * From local Where loc_cod = ?";
			con = ConexionBD.obtenerConexion();
			stmt=con.prepareStatement(query);
			stmt.setInt(1, codigo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				oLocal.setCodigoLocal(rs.getInt("loc_cod"));
				oLocal.setDescripcionLocal(rs.getString("loc_des"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oLocal;
	}
	
	private void validarDatos(Local oLocal) throws DAOExcepcion {
		System.out.println("LocalDAO: validarDatos(Local oLocal)");
		
		String msg = "";

		if(oLocal.getDescripcionLocal().trim().equals(""))
			msg += "Descripcion del Local no puede ser vacio. \n";
		if(oLocal.getDireccionLocal().trim().equals(""))
			msg += "Direccion del Local no puede ser vacio. \n";
		if(oLocal.getDistritoLocal().trim().equals(""))
			msg += "Distrito del Local no puede ser vacio. \n";
		if(!msg.equals("")) {//Si exite algun error lanza excepcion
			System.out.println("Error: \n" + msg);
			throw new DAOExcepcion(msg);
		}	
	}
	
	private void validarDuplicado(Local oLocal) throws DAOExcepcion {
		System.out.println("LocalDAO: validarDuplicado(Local oLocal)");
		
		String msg = "";
		
		if(existe(oLocal.getDuenoLocal().getCodigoUsuario(), oLocal.getDescripcionLocal()))
			msg += "Descripcion: " + oLocal.getDescripcionLocal() + " ya existe. \n";
		if(!msg.equals("")) {//Si exite algun error lanza excepcion
			System.out.println("Error: \n" + msg);
			throw new DAOExcepcion(msg);
		}
	}
	
	private boolean existe(int id_Dueno, String Descrip) {
		System.out.println("LocalDAO: existe(int id_Dueno, String Descrip)");
		
		String query = "Select usr_cod, loc_des From local " +
		   			   "Where usr_cod = ? And loc_des = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id_Dueno);
			stmt.setString(2, Descrip);
			rs = stmt.executeQuery();
			
			if (rs.next()){
				return true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return false;
	}
	
}
